#include <iostream>

using std::cout;
using std::endl;

//单例模式的设计需求：一个类只能创建一个对象（而不是一类对象）
//，对象不能有两个
class Singleton
{
public:
    static Singleton *getInstance()
    {
        if(_pInstance == nullptr)
        {
            _pInstance = new Singleton();
        }
        return _pInstance;//创建对象
    }

    static void destroy()
    {
        if(_pInstance)
        {
            delete _pInstance;
            _pInstance = nullptr;
        }
    }

private:
    Singleton()
    {
        cout << "Singleton()" << endl;
    }
    /* Singleton(const Singleton &rhs); */

    /* Singleton &operator=(const Singleton &rhs); */

    ~Singleton()
    {
        cout << "~Singleton()" << endl;
    }
    
private:
    static Singleton *_pInstance ;
};

Singleton *Singleton::_pInstance = nullptr;

int main(int argc, char *argv[])
{
    Singleton *ps1 = Singleton::getInstance();
    Singleton *ps2 = Singleton::getInstance();
    printf("ps1 = %p\n", ps1);
    printf("ps2 = %p\n", ps2);

    ps1->destroy();
    ps1->destroy();
    ps2->destroy();
    ps2->destroy();

    ps1 = nullptr;
    ps2 = nullptr;

    //单独的从构造来说的化，s1是可以拷贝构造的，但是s1是栈对象
    //栈对象需要进行销毁，需要执行析构函数，而此时析构函数已经
    //设置为私有了，所以此处s1就会报错
    //
    //如果析构函数没有设置为私有的，那么下面的代码是可以创建的
    //也就是还是不能满足一个类只能创建一个对象的效果
    /* Singleton s1 = *Singleton::getInstance(); */
    /* printf("&s1 = %p\n", &s1); */

    return 0;
}

